# -*- coding: utf-8 -*-
from django.contrib import admin
from agenda.models import Association, Evenement, Calendrier, Actualite
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from django.utils import timezone

class CalendrierAdmin(admin.StackedInline):
	"""Admin config pour modèle calendrier"""
	model               = Calendrier
	extra               = 0
	fields              = [('nom', 'slug')]
	prepopulated_fields = {"slug": ("nom",)}

class ActualiteAdmin(admin.ModelAdmin):
	"""Admin config pour modèle actualité"""
	list_display    = ('date_creation', 'date_modification', 'titre', 'publie')
	search_fields   = ['titre']
	list_filter     = ['publie', 'association']
	readonly_fields = ('date_creation', 'date_modification', 'user_creation', 'user_modification')
	fieldsets = (
			('général', {'fields': ['titre', 'publie', 'association']}),
			('contenu', {'classes': ['collapse', 'wide'], 'fields': ['contenu']}),
			('Informations', {'fields': [('date_creation', 'user_creation'), ('date_modification', 'user_modification')]}),
		)
	actions = ['publierActualites']

	def publierActualites(modeladmin, request, queryset):
		"""Action liste actualités : publie les actualités sélectionnées"""
		queryset.update(publie=True)

	publierActualites.short_description = "publier les actualités sélectionnées"

	#TODO ajouter suppression logique

	#TODO ajouter méthode pour filter la ddl association avec celles de l'utilisateur connecté seulement

	def save_model(self, request, obj, form, change):
		"""Sauvegarde l'objet actualité en ajoutant la date de création / modification et l'user"""
		if change:
			obj.date_modification = timezone.now()
			obj.user_modification = request.user
		else:
			obj.date_creation = timezone.now()
			obj.user_creation = request.user
		obj.save()

	def queryset(self, request):
		"""Filtre la liste des actualités seulement ceux des associations de l'user connecté"""
		qs = super(ActualiteAdmin, self).queryset(request)

		if request.user.is_superuser:
			return qs
		else:
			innerlist = Association.objects.filter(users = request.user)
			return qs.filter(association__in = innerlist)

admin.site.register(Actualite, ActualiteAdmin)

class EvenementAdmin(admin.ModelAdmin):
	"""Admin config pour modèle evenement"""
	list_display    = ('titre', 'debut', 'fin', 'publie')
	search_fields   = ['titre']
	date_hierarchy  = 'debut'
	list_filter     = ('publie',)
	readonly_fields = ('date_creation', 'date_modification', 'user_creation', 'user_modification')
	fieldsets = (
			('général', {'fields': [('titre', 'calendrier', 'publie')]}),
			('description',  {'classes': ['collapse', 'wide'], 'fields': ['description']}),
			('Horaires', {'fields': [('debut', 'fin')]}),
			('Informations', {'fields': [('date_creation', 'user_creation'), ('date_modification', 'user_modification')]}),
		)
	actions = ['publierEvenements']

	def publierEvenements(modeladmin, request, queryset):
		"""Action liste évènements : publie les évènements sélectionnés"""
		queryset.update(publie=True)

	publierEvenements.short_description = "publier les évènements sélectionnés"

	#TODO ajouter un statut supprimé sur l'évènement puis faire une suppression logique, créer une action suppression logique, enregistrer date suppression et user

	#TODO ajouter filtrage ddl calendriers avec ceux des associations de l'utilisateur connecté

	def save_model(self, request, obj, form, change):
		"""Sauvegarde l'objet evenement en ajoutant la date de création / modification et l'user"""
		if change:
			obj.date_modification = timezone.now()
			obj.user_modification = request.user
		else:
			obj.date_creation = timezone.now()
			obj.user_creation = request.user
		obj.save()


	def queryset(self, request):
		"""Filtre la liste des évènements seulement ceux des calendriers des associations de l'user courant"""
		qs = super(EvenementAdmin, self).queryset(request)

		if request.user.is_superuser:
			return qs
		else:
			innerlist = Association.objects.filter(users = request.user).values('users')
			return qs.filter(user_creation__in = innerlist)


admin.site.register(Evenement, EvenementAdmin)

class AssociationAdmin(admin.ModelAdmin):
	"""Admin config pour modèle association"""
	list_display        = ('nom', 'code_postal', 'ville')
	list_filter         = ('code_postal', 'ville')
	search_fields       = ['nom']
	prepopulated_fields = {"slug" : ("nom",)}
	fieldsets = (
			(None, {'fields': [('nom', 'slug')]}),
			('Coordonnées', {'fields' : ('adresse', 'cplt_adresse', ('code_postal', 'ville'), ('telephone', 'email'), 'url')}),
			('Utilisateurs', {'fields' : ('users',)}),
		)
	inlines = [CalendrierAdmin]
	filter_horizontal = ['users']

	def queryset(self, request):
		"""Filtre la liste des associations en fonction des permissions"""
		qs = super(AssociationAdmin, self).queryset(request)

		if request.user.is_superuser:
			return qs
		else:
			return qs.filter(users = request.user)

	def get_readonly_fields(self, request, obj=None):
		"""Renvoi la liste des champs readonly selon les permissions"""
		if obj:
			if request.user.is_superuser:
				return []
			else:
				return ['users']
		else:
			return []

	def get_actions(self, request):
		"""retourne la liste des actions permises selon les permissions"""
		actions = super(AssociationAdmin, self).get_actions(request)
		if not request.user.is_superuser:
			del actions['delete_selected']
		return actions

admin.site.register(Association, AssociationAdmin)
